#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMap>
#include <QThread>

#include <QtGlobal>
#include "../config/constvariable.h"
#include "model.h"
#include "../bll/readbyteprocess.h"
#include "bll/checktool.h"
#include "Tpkg/checkutils.h"
#include "trueapi.h"
#include "searchthread.h"

class TcpServer : public QObject
{
    Q_OBJECT
public:
    explicit TcpServer(QObject *parent = nullptr);

    ~TcpServer();
    //startTimer
    //
    //  @Desc:定时器推送
    void startTimer();
    // UiControl
    //
    //	@Desc: 前端控制指令
    //	@param msg
    void UiControl(QByteArray temp);

    // RewriteTargetId
    //
    //	@Desc: 重写地址
    //	@param oldID
    //	@param newID
    void RewriteTargetIdHandle(int old_addr,int new_addr); 
    // ClearTarget
    //
    //	@Desc: 清除靶标上的点(数据库数据逻辑删除)
    //	@param ID
    void toClearTarget(int ID);

    // OpenCalibrationTargetById
    //
    //	@Desc: 对靶标开启校准
    //	@param ID
    void OpenCalibrationTarget(int ID);
    // CloseCalibrationTargetById
    //
    //	@Desc: 对靶标关闭校准
    //	@param ID
    bool CloseCalibrationTarget(int ID);

    // ManualCalibration
    //
    //	@Desc: 手动微调校准（对单个靶进行微调校准）
    void ManualCalibration(int addr, int x, int y);
    //searchDateBullte
    //
    //    @Desc:查询导出界面的数据
//    void searchDateBullte(int groupNumber, int addr, QString currentDate);
    // ClearTargetHandle
    //
    //	@Desc: 清除靶标函数
    //	@param addr
    void ClearTargetHandle(int ID);
    // RelayByteToUi
    //
    //	@Desc: 和前端交互
    //	@param msg
    void RelayInfoToUi(const QByteArray& msg);



    QByteArray ToString(const QByteArray& string);


signals:
    void mySignalSendInfo(const QByteArray &);
    void mySignalToSearchData(int groupNumber, int addr, QString currentDate);

public slots:
    //start
    //
    //  @Desc:开启服务器
    void start();
    // onNewConnection
    //
    //	@Desc: 检测到有新的连接建立
    void onNewconnect();
    // onDisconnected
    //
    //	@Desc: 客户端断开连接
    void ondisconnect();
    // onReadyRead
    //
    //	@Desc: 读取客户端发送的信息
    void onreadReady();  
    // RelayStringWriteBack
    //
    //	@Desc: 回发中继Socket调用接口
    //	@param msg
    void RelayStringWriteBack(QString msg);
    // slotsTargetInfo
    //
    //	@Desc: 当前子弹数据
    //	@param msg
    void slotsTargetInfo(const OneTaregtBullet& oneTaregtBullet);
    // GetTargetStateInfo
    //
    //	@Desc: 获取靶标电量发送给前端
    //	@param msg
    void slotSendInfo(const QByteArray& info);

private:
    QTcpServer *tcpServer=nullptr;

    ReadbyteProcess *readbyteProcess=nullptr;

    SearchThread *searchDataThread = nullptr;
    QThread *threadSearch = nullptr;

    Api *api=nullptr;

    QTimer stateTimer;
    QTimer voltageTimer;

    // checkTools
    //
    //	@Desc: 初始化配置文件
    CheckTool checkTools;

    //sqliteTool
    //
    //  @Desc:数据库
    SQLiteTools* sqliteTool = nullptr;

    TrueApi *trueapi=nullptr;

    QMap<QString,QTcpSocket*> clientSocketMap;

    float C = 801 * 1.0   / (WeightOfTargetPaper * 1.0);

};

#endif // TCPSERVER_H
